/*
 * @(#)XfspGeneralizedDunnIndex.java        2004/08/01
 *
 * This file is part of Xfuzzy 3.1, a design environment for fuzzy logic
 * based systems.
 *
 * (c) 2000 IMSE-CNM. The authors may be contacted by the email address:
 *                    xfuzzy-team@imse.cnm.es
 *
 * Xfuzzy is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation.
 *
 * Xfuzzy is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * for more details.
 */

package xfuzzy.xfsp.model.types;

/**
 * <p> <b>Descripci�n:</b> clase com�n a todos los m�todos de validaci�n de
 * clusters mediante los �ndices de Dunn generalizados.
 * <p> <b>E-mail</b>: <ADDRESS>joragupra@us.es</ADDRRESS>
 * @author Jorge Agudo Praena
 * @version 1.2
 * @see IXfspTypeSimplifier
 * @see IXfspValidityMeasure
 * @see XfspDunnValidityMeasure
 * @see XfspTypeSimplifierFactory
 *
 */
public abstract class XfspGeneralizedDunnIndex
    extends XfspDunnValidityMeasure {

  /**
   * <p> <b>Descripci�n:</b> crea un medidor del �ndice de valoraci�n de
   * clusters seg�n el m�todo de generalizado de Dunn.
   * @param data Conjunto de datos que se quieren agrupar en clusters y del que
   * se va a calcular el n�mero �ptimo de ellos.
   * @param weights Pesos asignados a cada uno de los elementos que compone un
   * data de los que se van a estudiar (como hayan sido definidos previamente).
   *
   */
  public XfspGeneralizedDunnIndex(double[][] data, double[] weights) {
    super(data, weights);
  }

  /**
   * <p> <b>Descripci�n:</b> devuelve el valor del denominador para cualquiera
   * de los m�todos de validaci�n de Dunn generalizados.
   * @param data Conjunto de datos agrupables en <i>clusters</i>.
   * @param assign Asignaci�n hecha de los datos a los distintos
   * <i>clusters</i>.
   * @param weights Pesos asignados a los par�metros de las funciones de
   * pertenencia.
   * @param c N�mero del <i>cluster</i>.
   * @return Valoraci�n del denominador de los m�todos de validaci�n de Dunn
   * generalizados.
   *
   */
  protected double getDenominator(double[][] data, int[] assign,
                                  double[][] cluster, double[] weights, int c) {
    IXfspDistance d = new XfspEuclideanDistance(weights);
    double accumulative = 0;

    for (int i = 0; i < data.length; i++) {
      if (assign[i] == c) {
        accumulative += d.distance(data, cluster, i, c);
      }
    }
    int S = d.size(data, assign, c);
    return 2 * (accumulative / S);
  }
}
